home *** CD-ROM | disk | FTP | other *** search
/ The 640 MEG Shareware Studio 2 / The 640 Meg Shareware Studio CD-ROM Volume II (Data Express)(1993).ISO / pascal / totsrc.zip / TOTDIR.PAS < prev    next >
Pascal/Delphi Source File  |  1991-02-11  |  23KB  |  840 lines

  1. {               Copyright 1991 TechnoJock Software, Inc.               }
  2. {                          All Rights Reserved                         }
  3. {                         Restricted by License                        }
  4.  
  5. {                             Build # 1.00                             }
  6.  
  7. Unit totDIR;
  8. {$I TOTFLAGS.INC}
  9.  
  10. {
  11.  Development Notes:
  12.  
  13. }
  14.  
  15. INTERFACE
  16.  
  17. uses DOS,CRT,
  18.      totIO1, totIO2, totLINK, totSTR, totSYS, totWIN,
  19.      totINPUT, totFAST, totMISC, totMsg;
  20.  
  21. CONST
  22.    SignalUpdateDirField  =  10;   {Signal ID}
  23.    SignalUpdateFileField =  11;
  24.    ReadMessage: string[20] = 'Reading files...';
  25.    SortMessage: string[20] = 'Sorting files...';
  26.  
  27. TYPE
  28.  
  29. pDirDLLOBJ = ^DirDLLOBJ;
  30. DirDLLOBJ = object (DLLOBJ)
  31.    vShowDrives: boolean;
  32.    {methods ...}
  33.    constructor Init;
  34.    procedure   FillList;
  35.    procedure   SetDrives(On:boolean);
  36.    function    GetStr(Node:DLLNodePtr;Start,Finish: longint):string;  VIRTUAL;
  37.    destructor  Done;
  38. end; {DirDLLOBJ}
  39.  
  40. pFilesFieldOBJ = ^FilesFieldOBJ;
  41. FilesFieldOBJ = object (ListIOOBJ)
  42.    vFileList: ^FileDLLOBJ;
  43.    vSortCode: byte;
  44.    vSortOrder: boolean;
  45.    {methods ...}
  46.    constructor Init;
  47.    procedure   SetFileDetails(FileMasks:string; FileAttrib: word);
  48.    procedure   SetSortDetails(SortCode: byte; SortOrder: boolean);
  49.    procedure   FillList;
  50.    function    GetChosenFile: string;
  51.    function    Select(K:word; X,Y:byte):TAction;                       VIRTUAL;
  52.    procedure   ShowItemDetails(HiPick: integer);                       VIRTUAL;
  53.    function    GetString(Pick:integer): string;                        VIRTUAL;
  54.    function    SelectPick(InKey:word;X,Y:byte): tAction;               VIRTUAL;
  55.    procedure   HandleSignal(var BaseSig:tSignal; var NewSig:tSignal);  VIRTUAL;
  56.    destructor  Done;                                                   VIRTUAL;
  57. end; {FilesFieldOBJ}
  58.  
  59. pDirFieldOBJ = ^DirFieldOBJ;
  60. DirFieldOBJ = object (ListIOOBJ)
  61.    vDirList: ^DirDLLOBJ;
  62.    {methods ...}
  63.    constructor Init;
  64.    procedure   FillList;
  65.    procedure   ReadDir(Status:tStatus);
  66.    function    Select(K:word; X,Y:byte):TAction;                       VIRTUAL;
  67.    function    GetString(Pick:integer): string;                        VIRTUAL;
  68.    function    SelectPick(InKey:word;X,Y:byte): tAction;               VIRTUAL;
  69.    procedure   RaiseSignal(var TheSig:tSignal);                        VIRTUAL;
  70.    procedure   HandleSignal(var BaseSig:tSignal; var NewSig:tSignal);  VIRTUAL;
  71.    destructor  Done;                                                   VIRTUAL;
  72. end; {DirFieldOBJ}
  73.  
  74. pFileInputFieldOBJ = ^FileInputFieldOBJ;
  75. FileInputFieldOBJ = object (LateralIOOBJ)
  76.    vChangeDir: boolean;
  77.    vChangeMask: boolean;
  78.    vLastInput: string;
  79.    {methods ...}
  80.    constructor Init;
  81.    procedure   SetLastValue(Mask:string);
  82.    procedure   WriteLabel(Status:tStatus);                             VIRTUAL;
  83.    function    ProcessEnter:tAction;                                   VIRTUAL;
  84.    procedure   RaiseSignal(var TheSig:tSignal);                        VIRTUAL;
  85.    procedure   ShutdownSignal(var BaseSig:tSignal);                    VIRTUAL;
  86.    function    Suspend:boolean;                                        VIRTUAL;
  87.    destructor  Done;                                                   VIRTUAL;
  88. end; {FileInputFieldOBJ}
  89.  
  90. pDirWinOBJ = ^DirWinOBJ;
  91. DirWinOBJ = object
  92.    vFileSpec: ^FileInputFieldOBJ;
  93.    vFileList: ^FilesFieldOBJ;
  94.    vDirList: ^DirFieldOBJ;
  95.    vOK:  Strip3DIOOBJ;
  96.    vCancel: Strip3DIOOBJ;
  97.    vHelp: Strip3DIOOBJ;
  98.    vControl: ControlKeysIOOBJ;
  99.    vManager: WinFormOBJ;
  100.    vOldDir: string[80];
  101.    vStartDir: string[80];
  102.    vEndDir: string[80];
  103.    {methods ...}
  104.    constructor Init;
  105.    function    Action: pWinFormOBJ;
  106.    function    Go: tAction;
  107.    procedure   SetFileDetails(StartDir:string; FileMasks:string; FileAttrib: word);
  108.    procedure   SetSortDetails(SortCode: byte; SortOrder: boolean);
  109.    function    Win: MoveWinPtr;
  110.    function    GetChosenFile: string;
  111.    destructor  Done;                                                   VIRTUAL;
  112. end; {DirWinOBJ}
  113.  
  114. IMPLEMENTATION
  115. var Floppies: byte;
  116. {|||||||||||||||||||||||||||||||||||||||||||||}
  117. {                                             }
  118. {     M i s c.  P r o c s   &   F u n c s     }
  119. {                                             }
  120. {|||||||||||||||||||||||||||||||||||||||||||||}
  121. procedure WriteFullDir;
  122. {}
  123. var Str:string;
  124. begin
  125.    GetDir(0,Str);
  126.    Screen.WritePlain(1,17,padleft(Str,45,' '));
  127. end; {WriteFullDir}
  128.  
  129. {$F+}
  130. procedure DirHelp(ID:word);
  131. {}
  132. var  HelpWin: MessageOBJ;
  133. begin
  134.    with HelpWin do
  135.    begin
  136.       Init(1,'File Load Help');
  137.       AddLine('Enter a filename (or file mask) in the Name ');
  138.       Addline('box, or TAB to the file list and select a');
  139.       Addline('file from the list by pressing Enter or ');
  140.       AddLine('double clicking the mouse.');
  141.       AddLine('');
  142.       AddLine('To change directories, TAB to the Directories');
  143.       AddLine('list and select one.');
  144.       AddLine('');
  145.       Show;
  146.       Done;
  147.    end;
  148. end; {DirHelp}
  149. {$IFNDEF OVERLAY}
  150.   {$F-}
  151. {$ENDIF}
  152. {|||||||||||||||||||||||||||||||||||||||||||}
  153. {                                           }
  154. {     D i r D L L O b j   M E T H O D S     }
  155. {                                           }
  156. {|||||||||||||||||||||||||||||||||||||||||||}
  157. constructor DirDLLOBJ.Init;
  158. {}
  159. begin
  160.    DLLOBJ.Init;
  161.    vShowDrives := true;
  162. end; {DirDLLOBJ.Init}
  163.  
  164. procedure DirDLLOBJ.SetDrives(On:boolean);
  165. {}
  166. begin
  167.    vShowDrives := On;
  168. end; {DirDLLOBJ.SetDrives}
  169.  
  170. procedure DirDLLOBJ.FillList;
  171. {}
  172. var
  173.   DirInfo: SearchRec;
  174.   Drive: string;
  175.   I : integer;
  176.   Result: longint;
  177.   Ecode : integer;
  178.   ActiveDrive: integer;
  179. begin
  180.    if vStartNodePtr <> Nil then
  181.       EmptyList;
  182.    FindFirst('*.*', AnyFile, DirInfo);
  183.    while DOSError = 0 do
  184.    begin
  185.       if ((DirInfo.Attr and Directory) = Directory)
  186.       and (DirInfo.Name <> '.') then
  187.       begin
  188.          Drive := '['+DirInfo.Name+']';
  189.          Ecode := Add(Drive,succ(length(Drive)));
  190.          if Ecode = 0 then
  191.             vActiveNodePtr^.SetStatus(0,true);  {indicates directory change}
  192.       end;
  193.       FindNext(DirInfo);
  194.    end;
  195.    if vShowDrives then  {get active drives}
  196.    begin
  197.       {$I-}
  198.       getdir(0,Drive);
  199.       {$I-}
  200.       if IOResult = 0 then
  201.          ActiveDrive := ord(Drive[1]) - 64
  202.       else
  203.          ActiveDrive := 0;
  204.       if (Floppies >= 1) and (ActiveDrive <> 1) then
  205.       begin
  206.          Drive := '[ -A- ]';
  207.          Ecode := Add(Drive,8);
  208.       end;
  209.       if (Floppies >= 2) and (ActiveDrive <> 2) then
  210.       begin
  211.          Drive := '[ -B- ]';
  212.          Ecode := Add(Drive,8);
  213.       end;
  214.       for I := 3 to 26 do {test all letters}
  215.       begin
  216.          Result := DiskSize(I);
  217.          if (Result <> -1) and (ActiveDrive <> I) then {valid drive}
  218.          begin
  219.             Drive := '[ -'+char(I+64)+'- ]';
  220.             Ecode := Add(Drive,8);
  221.          end;
  222.       end;
  223.    end;
  224.    Jump(1);
  225. end; {DirDLLOBJ.FillList}
  226.  
  227. function DirDLLOBJ.GetStr(Node:DLLNodePtr;Start,Finish: longint):string;
  228. {ignores Start and Finish parameters}
  229. var temp : string;
  230. begin
  231.    if (Node = Nil)
  232.    or (Node^.vDataPtr = Nil)
  233.    or (Node^.vSize = 0)  then
  234.       GetStr := ''
  235.    else
  236.    begin
  237.       Move(mem[seg(Node^.vDataPtr^):ofs(Node^.vDataPtr^)],Temp[0],15);
  238.       GetStr := Temp;
  239.    end;
  240. end; {DirDLLOBJ.GetStr}
  241.  
  242. destructor DirDLLOBJ.Done;
  243. {}
  244. begin
  245.    DLLOBJ.Done;
  246. end; {DirDLLOBJ.Done}
  247. {||||||||||||||||||||||||||||||||||||||||||||||||||||}
  248. {                                                    }
  249. {     F i l e s F i e l d O B J   M e t h o d s      }
  250. {                                                    }
  251. {||||||||||||||||||||||||||||||||||||||||||||||||||||}
  252. constructor FilesFieldOBJ.Init;
  253. {}
  254. begin
  255.    ListIOOBJ.Init(3,4,13,12,'Files:');
  256.    new(vFileList,Init);
  257.    vSortCode := 0;
  258.    vSortOrder := true;
  259. end; {FilesFieldOBJ.Init}
  260.  
  261. procedure FilesFieldOBJ.SetFileDetails(FileMasks:string; FileAttrib: word);
  262. {}
  263. begin
  264.    vFileList^.SetFileDetails(FileMasks,FileAttrib);
  265. end; {FilesFieldOBJ.SetFileDetails}
  266.  
  267. procedure FilesFieldOBJ.ShowItemDetails(HiPick: integer);
  268. {}
  269. var FileInfo: tFileInfo;
  270. begin
  271.    vFileList^.GetFileRecord(FileInfo,HiPick);
  272.    if FileInfo.FileName = NoFiles then
  273.      Screen.WritePlain(1,18,replicate(45,' '))
  274.    else
  275.      Screen.WritePlain(1,18,padleft(LongName(FileInfo),45,' '));
  276. end; {FilesFieldOBJ.ShowItemDetails}
  277.  
  278. procedure FilesFieldObj.FillList;
  279. {}
  280. begin
  281.    Screen.WritePlain(1,18,padleft(ReadMessage,45,' '));
  282.    vFileList^.FillList;
  283.    Screen.WritePlain(1,18,padleft(SortMessage,45,' '));
  284.    vFileList^.Sort(vSortCode,vSortOrder);
  285.    vListAssigned := true;
  286.    vTotPicks := vFileList^.TotalNodes;
  287. end;  {FilesFieldObj.AssignList}
  288.  
  289. function FilesFieldOBJ.GetString(Pick:integer): string;
  290. {}
  291. var
  292.   TempPtr : DLLNodePtr;
  293. begin
  294.    TempPtr := vFileList^.NodePtr(Pick);
  295.    if TempPtr <> Nil then
  296.       vFileList^.ShiftActiveNode(TempPtr,Pick);
  297.    GetString := vFileList^.GetStr(TempPtr,0,0);
  298. end; {FilesFieldOBJ.GetString}
  299.  
  300. function FilesFieldOBJ.SelectPick(InKey:word;X,Y:byte):tAction;
  301. {}
  302. var SP: tAction;
  303. begin
  304.   if (Inkey = 523) and (TargetPick(X,Y) <> 0) then  {select the new pick}
  305.   begin
  306.      MouseChoose(X,Y);
  307.      SP := Finished;
  308.   end
  309.   else if (Inkey = 13) then
  310.      SP := Finished
  311.   else
  312.      SP := none;
  313.   if (SP = Finished) and (GetString(vFileList^.ActiveNodeNumber) = NoFiles) then
  314.      SP := none;
  315.   SelectPick := SP;
  316. end; {FilesFieldOBJ.SelectPick}
  317.  
  318. function FilesFieldOBJ.Select(K:word; X,Y:byte):TAction;
  319. {}
  320. var New: byte;
  321. begin
  322.    vScrollBarOn := (vTotPicks >= vRows);
  323.    vActiveField := true;
  324.    Display(HiStatus);
  325.    WriteLabel(HiStatus);
  326.    WriteMessage;
  327.    if (K = 513) or (K=523) then
  328.    begin
  329.       if vScrollBarOn and (X = vBorder.X2) then
  330.         {nothing for now}
  331.       else
  332.       begin
  333.          New := HitItem(Y);
  334.          if New > 0 then
  335.          begin
  336.             WriteItem(vActivePick,false);
  337.             vActivePick := New;
  338.             WriteItem(vActivePick,true);
  339.             if (K=523) then
  340.             begin
  341.                Select := SelectPick(K,X,Y);
  342.                exit;
  343.             end;   
  344.          end;
  345.       end;
  346.    end;
  347.    Select := none;
  348. end; {FilesFieldOBJ.Select}
  349.  
  350. procedure FilesFieldOBJ.SetSortDetails(SortCode: byte; SortOrder: boolean);
  351. {}
  352. begin
  353.    vSortCode := SortCode;
  354.    vSortOrder := SortOrder;
  355. end; {FilesFieldOBJ.SetSortDetails}
  356.  
  357. procedure FilesFieldOBJ.HandleSignal(var BaseSig:tSignal; var NewSig:tSignal);
  358. {}
  359. var
  360.   Len : byte;
  361.   NewMask: string;
  362. begin
  363.    if BaseSig.ID = SignalUpdateFileField then
  364.    begin
  365.       if (BaseSig.MSGtype = 0) then {new filemask}
  366.       begin
  367.          move(BaseSig.MsgPtr^,Len,1);
  368.          if len > 0 then
  369.          begin
  370.             move(BaseSig.MsgPtr^,NewMask,succ(Len));
  371.             Screen.WritePlain(1,18,padleft(ReadMessage,45,' '));
  372.             vFileList^.FillNewMask(NewMask);
  373.             Screen.WritePlain(1,18,padleft(SortMessage,45,' '));
  374.             vFileList^.Sort(vSortCode,vSortOrder);
  375.          end;
  376.       end
  377.       else
  378.          FillList;
  379.       vTopPick := 1;
  380.       vTotPicks := vFileList^.TotalNodes;
  381.       vActivePick := 1;
  382.       Display(Norm);
  383.       BaseSig.ID := 0; {All Done!}
  384.    end;
  385. end; {FilesFieldOBJ.HandleSignal}
  386.  
  387. function FilesFieldOBJ.GetChosenFile:string;
  388. {}
  389. begin
  390.    GetChosenFile := GetString(vTopPick + pred(vActivePick));
  391. end; {FilesFieldOBJ.GetChosenFile}
  392.  
  393. destructor FilesFieldOBJ.Done;
  394. {}
  395. begin
  396.    ListIOOBJ.Done;
  397.    dispose(vFileList,Done);
  398. end; {FilesFieldOBJ.Done}
  399. {||||||||||||||||||||||||||||||||||||||||||||||||}
  400. {                                                }
  401. {     D i r F i e l d O B J   M e t h o d s      }
  402. {                                                }
  403. {||||||||||||||||||||||||||||||||||||||||||||||||}
  404. constructor DirFieldOBJ.Init;
  405. {}
  406. begin
  407.    ListIOOBJ.Init(18,4,15,12,('Directories:'));
  408.    new(vDirList,Init);
  409. end; {DirFieldOBJ.Init}
  410.  
  411. function DirFieldOBJ.GetString(Pick:integer): string;
  412. {}
  413. var
  414.   TempPtr : DLLNodePtr;
  415. begin
  416.    TempPtr := vDirList^.NodePtr(Pick);
  417.    if TempPtr <> Nil then
  418.       vDirList^.ShiftActiveNode(TempPtr,Pick);
  419.    GetString := vDirList^.GetStr(TempPtr,0,0);
  420. end; {DirFieldOBJ.GetString}
  421.  
  422. procedure DirFieldOBJ.RaiseSignal(var TheSig:tSignal);
  423. {}
  424. begin
  425.    with TheSig do
  426.    begin
  427.       ID := SignalUpdateFileField;
  428.       MsgType := 99;
  429.    end;
  430. end; {DirFieldOBJ.RaiseSignal}
  431.  
  432. procedure DirFieldOBJ.HandleSignal(var BaseSig:tSignal; var NewSig:tSignal);
  433. {}
  434. begin
  435.    if (BaseSig.ID = SignalUpdateDirField) then
  436.    begin
  437.       ReadDir(Norm);
  438.       BaseSig.ID := 0; {All Done!}
  439.    end;
  440. end; {DirFieldOBJ.HandleSignal}
  441.  
  442. procedure DirFieldOBJ.FillList;
  443. {}
  444. begin
  445.    vDirList^.FillList;
  446.    vTopPick := 1;
  447.    vTotPicks := vDirList^.TotalNodes;
  448.    vActivePick := 1;
  449.    vListAssigned := true;
  450. end; {DirFieldOBJ.FillList}
  451.  
  452. procedure DirFieldOBJ.ReadDir(Status:tStatus);
  453. {}
  454. begin
  455.    FillList;
  456.    Display(Status);
  457. end; {DirFieldOBJ.ReadDir}
  458.  
  459. function DirFieldOBJ.SelectPick(InKey:word;X,Y:byte):tAction;
  460. {}
  461. var
  462.   TempPtr : DLLNodePtr;
  463.   NewDir : string;
  464. begin
  465.   if (Inkey = 523) then  {select the new pick}
  466.   begin
  467.      if TargetPick(X,Y) <> 0 then
  468.         MouseChoose(X,Y)
  469.      else
  470.      begin
  471.         SelectPick := none;
  472.         exit;
  473.      end;
  474.   end;
  475.   {change to the new drive/directory and display the new list}
  476.   NewDir := GetString(pred(vTopPick)+vActivePick);
  477.   TempPtr := vDirList^.NodePtr(pred(vTopPick)+vActivePick);
  478.   if TempPtr^.GetStatus(0) then {directory}
  479.   begin
  480.      delete(NewDir,1,1);  {remove []}
  481.      delete(NewDir,length(NewDir),1);
  482.   end
  483.   else
  484.   begin
  485.      NewDir := NewDir[4]+':';
  486.   end;
  487. {$I-}
  488.   ChDir(NewDir);
  489. {$I+}
  490.   if IOResult = 0 then
  491.   begin
  492.      WriteFullDir;
  493.      ReadDir(HiStatus);
  494.      vScrollBarOn := vTotPicks > vRows;
  495.      {now raise a signal to load a new directory}
  496.      SelectPick := Signal;
  497.   end
  498.   else
  499.      SelectPick := none;
  500. end; {DirFieldOBJ.SelectPick}
  501.  
  502. function DirFieldOBJ.Select(K:word; X,Y:byte):TAction;
  503. {}
  504. var New: byte;
  505. begin
  506.    vScrollBarOn := (vTotPicks >= vRows);
  507.    vActiveField := true;
  508.    Display(HiStatus);
  509.    WriteLabel(HiStatus);
  510.    WriteMessage;
  511.    if (K = 513) or (K=523) then
  512.    begin
  513.       if vScrollBarOn and (X = vBorder.X2) then
  514.         {nothing for now}
  515.       else
  516.       begin
  517.          New := HitItem(Y);
  518.          if New > 0 then
  519.          begin
  520.             WriteItem(vActivePick,false);
  521.             vActivePick := New;
  522.             WriteItem(vActivePick,true);
  523.             if (K=523) then
  524.             begin
  525.                Select := SelectPick(K,X,Y);
  526.                exit;
  527.             end;   
  528.          end;
  529.       end;
  530.    end;
  531.    Select := none;
  532. end; {DirFieldOBJ.Select}
  533.  
  534. destructor DirFieldOBJ.Done;
  535. {}
  536. begin
  537.    ListIOOBJ.Done;
  538.    dispose(vDirList,Done);
  539. end; {DirFieldOBJ.Done}
  540. {||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||}
  541. {                                                            }
  542. {     F i l e I n p u t F i e l d O B J   M e t h o d s      }
  543. {                                                            }
  544. {||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||}
  545. constructor FileInputFieldOBJ.Init;
  546. {}
  547. begin
  548.    LateralIOOBJ.Init(3,2,30,75);
  549.    vRules := EraseDefault;
  550.    vInputStr := '*.*';
  551.    vLastInput := vInputStr;
  552.    vChangeDir := false; 
  553.    vChangeMask := false;
  554.    SetPadChar(' ');
  555. end; {FileInputFieldOBJ.Init}
  556.  
  557. procedure FileInputFieldOBJ.SetLastValue(Mask:string);
  558. {}
  559. begin
  560.    vLastInput := Mask;
  561. end; {FileInputFieldOBJ.SetLastValue}
  562.  
  563. procedure FileInputFieldOBJ.WriteLabel(Status:tStatus);
  564. {}
  565. var
  566.   Norm,Hi: byte;
  567. begin
  568.    AssignColors(IOTOT^.vLabel,IOTOT^.vField,Status,Hi,Norm);
  569.    if (Hi = 0) or (Norm = 0) then
  570.       Screen.WritePlain(vBoundary.X1,pred(vBoundary.Y1),'Name:')
  571.    else
  572.       Screen.WriteHi(vBoundary.X1,pred(vBoundary.Y1),Hi,Norm,'Name:');
  573. end; {FileInputFieldOBJ.WriteLabel}
  574.  
  575. function FileInputFieldOBJ.ProcessEnter: tAction;
  576. {if a file is specified, finish, otherwise raise a signal}
  577. var
  578.   D,N,E,FN : string;
  579. begin
  580.    vChangeDir  := false;
  581.    vChangeMask := false;
  582.    if vInputStr = '' then
  583.    begin
  584.       vInputStr := '*.*';
  585.       vChangeMask := true;
  586.    end
  587.    else
  588.    begin
  589.       FSplit(vInputStr,D,N,E);
  590.       FN := N+E;
  591.       if  (pos('*',FN) = 0)
  592.       and (pos('?',FN) = 0)
  593.       and (FN <> '') then {a real filename was entered}
  594.       begin
  595.          ProcessEnter := Finished;
  596.          exit;
  597.       end
  598.       else
  599.       begin
  600.          if D <> '' then
  601.          begin
  602.             if  (D[length(D)] = '\')
  603.             and  not ((length(D) = 3) and (pos(':',D) = 2) )
  604.             and (D <> '\') then
  605.                delete(D,length(D),1);
  606.             {$I-}
  607.             chdir(D);
  608.             {$I+}
  609.             if IOResult = 0 then
  610.             begin
  611.                WriteFullDir;
  612.                vChangeDir := true;
  613.             end;
  614.             if FN = '' then
  615.                vInputStr := '*.*'
  616.             else
  617.                vInputStr := FN;
  618.             vChangeMask := true;
  619.          end
  620.          else  {must have entered one or more wildcard file names}
  621.             vChangeMask := true;
  622.       end;
  623.    end;
  624.    CursorHome;
  625.    Display(HiStatus);
  626.    vLastInput := vInputStr;
  627.    ProcessEnter := signal;
  628. end; {FileInputFieldOBJ.ProcessEnter}
  629.  
  630. procedure FileInputFieldOBJ.RaiseSignal(var TheSig:tSignal);
  631. {}
  632. begin
  633.    with TheSig do
  634.    begin
  635.       if vChangeDir then
  636.       begin
  637.          ID := SignalUpdateDirField;
  638.          MsgType := 99;
  639.          vChangeDir := false;
  640.       end
  641.       else
  642.       begin
  643.          ID := SignalUpdateFileField;
  644.          MsgType := 0;
  645.          MsgPtr := @vInputStr;
  646.          vChangeMask := false;
  647.       end;
  648.    end;
  649. end; {FileInputFieldOBJ.RaiseSignal}
  650.  
  651. procedure FileInputFieldOBJ.ShutdownSignal(var BaseSig:tSignal);
  652. {}
  653. begin
  654.    with BaseSig do
  655.    begin
  656.       if vChangeMask then
  657.       begin
  658.          ID := SignalUpdateFileField;
  659.          MsgType := 0;
  660.          MsgPtr := @vInputStr;
  661.          vChangeMask := false;
  662.       end;
  663.    end;
  664.    MoveCursor;
  665. end; {FileInputFieldOBJ.ShutdownSignal}
  666.  
  667. function FileInputFieldOBJ.Suspend:boolean;
  668. {}
  669. begin
  670.    Suspend := LateralIOOBJ.Suspend;
  671.    if vLastInput <> vInputStr then
  672.    begin
  673.       Suspend := false;
  674.       Key.StuffBuffer(13);
  675.       Key.StuffBuffer(9);
  676.    end;
  677. end; {FileInputFieldOBJ.Suspend}
  678.  
  679. destructor FileInputFieldOBJ.Done;
  680. {}
  681. begin
  682.    LateralIOOBJ.Done;
  683. end; {FileInputFieldOBJ.Done}
  684. {||||||||||||||||||||||||||||||||||||||||||||}
  685. {                                            }
  686. {     D i r W i n O B J   M e t h o d s      }
  687. {                                            }
  688. {||||||||||||||||||||||||||||||||||||||||||||}
  689. constructor DirWinOBJ.Init;
  690. {}
  691. begin
  692.    new(vFileSpec,Init);
  693.    new(vFileList,Init);
  694.    new(vDirList,Init);
  695.    vOK.Init(35,2,'   ~O~K   ',Finished);
  696.    vOK.SetHotKey(280); {Alt-O}
  697.    vCancel.Init(35,5,' ~C~ancel ',Escaped);
  698.    vCancel.SetHotkey(302); {Alt-C}
  699.    vHelp.Init(35,8,'  ~H~elp  ',Help);
  700.    vHelp.SetHotkey(291); {Alt-H}
  701.    vControl.Init; {Tab, STab, F10, Esc}
  702.    vStartDir := '';
  703.    vFileSpec^.SetID(1);
  704.    vFileList^.SetID(2);
  705.    vDirList^.SetID(3);
  706.    vOK.SetID(4);
  707.    vCancel.SetID(5);
  708.    vHelp.SetID(HelpID);
  709.    with vManager do
  710.    begin
  711.       Init;
  712.       Win^.SetSize(18,3,63,22,1);
  713.       Win^.SetTitle(' Choose a file ');
  714.       AddItem(vControl);
  715.       AddItem(vFileSpec^);
  716.       AddItem(vFileList^);
  717.       AddItem(vDirList^);
  718.       AddItem(vOK);
  719.       AddItem(vCancel);
  720.       AddItem(vHelp);
  721.       SetHelpHook(DirHelp);
  722.    end;
  723. end; {DirWinOBJ.Init}
  724.  
  725. function DirWinOBJ.Win:MoveWinPtr;
  726. {}
  727. begin
  728.    Win := vManager.Win;
  729. end; {DirWinOBJ.Win}
  730.  
  731. function DirWinOBJ.Action: pWinFormOBJ;
  732. {}
  733. begin
  734.    Action := @vManager;
  735. end; {DirWinOBJ.Action}
  736.  
  737. procedure DirWinOBJ.SetFileDetails(StartDir:string; FileMasks:string; FileAttrib: word);
  738. {}
  739. begin
  740.    vStartDir := StartDir;
  741.    vFileList^.SetFileDetails(FileMasks,FileAttrib);
  742.    vFileSpec^.SetValue(FileMasks);
  743.    vFileSpec^.SetLastValue(FileMasks);
  744. end; {DirWinOBJ.SetFileDetails}
  745.  
  746. procedure DirWinOBJ.SetSortDetails(SortCode: byte; SortOrder: boolean);
  747. {}
  748. begin
  749.    vFileList^.SetSortDetails(SortCode,SortOrder);
  750. end; {DirWinOBJ.SetSortDetails}
  751.  
  752. function DirWinOBJ.Go: tAction;
  753. {}
  754. var
  755.    Visible,kDouble: boolean;
  756.    Result: tAction;
  757. begin
  758.    Visible:= Mouse.Visible;
  759.    kDouble := Key.GetDouble;
  760.    if not kDouble then
  761.       Key.SetDouble(true);
  762.    getdir(0,vOldDir);
  763.    if vStartDir <> '' then
  764.    begin
  765.       {$I-}
  766.       chdir(vStartDir);
  767.       {$I+}
  768.       if IOResult <> 0 then
  769.          {whogivesashit};
  770.    end;
  771.    vManager.Draw;
  772.    vFileList^.FillList;
  773.    vDirList^.FillList;
  774.    WriteFullDir;
  775.    if not Visible then
  776.       Mouse.Show;
  777.    repeat
  778.       Result := vManager.Go;
  779.    until ((Result = Finished) and (vFileList^.GetChosenFile=NoFiles)) = false;
  780.    Go := Result;
  781.    vManager.Win^.Remove;
  782.    getdir(0,vEndDir);
  783.    {$I-}
  784.    chdir(vOldDir);
  785.    {$I+}
  786.    if IOResult <> 0 then
  787.       {whogivesashit};
  788.    Key.SetDouble(kDouble);
  789.    if not Visible then
  790.       Mouse.Hide;
  791. end; {DirWinOBJ.Go}
  792.  
  793. function DirWinOBJ.GetChosenFile:string;
  794. {}
  795. var Str: string;
  796. begin
  797.    Str := vFileSpec^.GetValue;
  798.    if  (pos('*',Str) = 0)
  799.    and (pos('?',Str) = 0)
  800.    and (Str <> '') then
  801.      GetChosenFile := Str
  802.    else
  803.      GetChosenFile := SlashedDirectory(vEndDir)+vFileList^.GetChosenFile;
  804. end; {DirWinOBJ.GetChosenFile}
  805.  
  806. destructor DirWinOBJ.Done;
  807. {}
  808. begin
  809.    dispose(vFileSpec,Done);
  810.    dispose(vFileList,Done);
  811.    dispose(vDirList,Done);
  812.    vOK.Done;
  813.    vCancel.Done;
  814.    vHelp.Done;
  815.    vControl.Done;
  816.    vManager.Done;
  817. end; {DirWinOBJ.Done}
  818. {|||||||||||||||||||||||||||||||||||||||||||||||}
  819. {                                               }
  820. {     U N I T   I N I T I A L I Z A T I O N     }
  821. {                                               }
  822. {|||||||||||||||||||||||||||||||||||||||||||||||}
  823. procedure DIRInit;
  824. {initilizes objects and global variables}
  825. var Equip: EquipObj;
  826. begin
  827.    Equip.Init;
  828.    Floppies := Equip.FloppyDrives;
  829. end;
  830.  
  831. {end of unit - add initialization routines below}
  832. {$IFNDEF OVERLAY}
  833. begin
  834.    DIRInit;
  835. {$ENDIF}
  836. end.
  837.  
  838.  
  839.  
  840.